iOS网络数据 - 同步加载

读取网络数据是 iOS 开发中很重要的部分,下面我们用获取一个网页的方式来了解获取网络数据。

下面我们使用 NSString 来接收一个网页的源代码:

1
2
3
4
5
6
7
8
9
10
11
12
func loadWedDataToHTML() {
let url = NSURL(string: "http://www.jikexueyuan.com")
do {
let str = try NSString(contentsOfURL: url!, encoding: NSUTF8StringEncoding)
print(str)
}
catch {
print("fail")
}
}

而很多时候我们在读取一个 HTTP 协议的数据时,可能并不是一个字符串的数据,有可能是一个二进制类型的数据,如果说要把一个页面读取成二进制的数据的话,可以直接把它读成一个 NSData 类型,如下:

1
2
3
4
5
6
7
func loadWedDataToNSData() {
let url = NSURL(string: "http://www.jikexueyuan.com")
let data = NSData(contentsOfURL: url!)
print(data)
}

在这里虽然表现的是二进制文件,实际上和用 NSString 接收一样,NSData 实际上也是这个网页的源代码,所以当我们获取到网页的数据,并希望对它做一些修改时,也可以将 NSData 转成 NSString:

1
2
3
4
5
6
7
8
func loadWedDataToNSData() {
let url = NSURL(string: "http://www.jikexueyuan.com")
let data = NSData(contentsOfURL: url!)
let str = NSString(data: data!, encoding: NSUTF8StringEncoding)
print(str)
}

但实际上很多在通信的时候,并不是使用这两种方式,如果使用以上两种方式,有两点点是必须的:

  1. 这个网址必须是可以打开的。

    因为如果这个链接是不能打开的,那么程序会一直停留在获取这里;

  2. 这个通信的时间特别短,特别快;

    因为这两种通信方式都是同步的,这就意味着此时主线程无法对 UI 进行响应;

所以说实际开发过程中,一般不使用这两种方式进行通讯。这两种方式一般会用来读取本地的数据,而最常使用的API 是使用 NSURLConnection 进行网络的同步请求和异步请求。

NSURLConnection

1
2
3
4
let url = NSURL(string: "http://www.jikexueyuan.com")
let request = NSURLRequest(URL: url!)
let data = try! NSURLConnection.sendSynchronousRequest(request, returningResponse: nil)
print(data)

sendSynchronousRequest 的两个传入参数:分别是网络请求和URL的回应信息,上面我们了解了网络请求这个传入参数,那么 URL 的回应信息 returningResponse 又是什么呢?实际上他是HTTP协议的协议头,它也可以被打印出来:

1
2
3
4
5
6
7
let url = NSURL(string: "http://www.jikexueyuan.com")
var resp: NSURLResponse?
let request = NSURLRequest(URL: url!)
let data = try! NSURLConnection.sendSynchronousRequest(request, returningResponse: &resp)
if let r = resp {
print(r)
}

NSURLSession

在 iOS9 中, NSURLConnection 已经被抛弃,取而代之的是NSURLSession。 NSURLSession的使用步骤进步如下:

  1. 通过 NSURLSession 的实例创建 NSURLSessionTask;
  2. 执行 NSURLSessionTask;

NSURLSessionTask 可以简单理解为任务,如数据请求任务,下载任务,上传任务等,它是一个抽象类,而我们使用的是它的子类:

  • NSURLSessionDataTask
  • NSURLSessionUploadTask
  • NSURLSessionDownloadTask

从这几个子类的名字就可以大概猜出他们的作用了,接下来我们就用一个简单的 get 请求,来使用NSURLSessionDataTask。后面的两个子类我们会在以后单独开篇再讲。

1
2
3
4
5
6
7
8
9
10
11
func urlSession() {
let session = NSURLSession.sharedSession()
let url = NSURL(string: "http://www.jikexueyuan.com")
let task = session.dataTaskWithURL(url!) { (data: NSData?, resp: NSURLResponse?, error: NSError?) in
print(data)
print(resp)
print(error)
}
task.resume()
}

以上就是 iOS 进行网络获取主要的几种方法。